<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue中插槽的使用</title>
    <!-- 导入vue库依赖 -->
    <script src="./js/vue.js"></script>
    <script src="./js/vue-router.js"></script>
    <style>
        .current {
            color: pink
        }
    </style>
</head>

<body>
    <div id="app">


        <p>----------- 插槽的使用一 ---------------</p>

        <alert-box>父组件模板内容</alert-box>
        <p>----------- 插槽的使用二--------------------</p>
        <alert-box></alert-box>
        <p>--------- 插槽的使用三------------</p>
        <alert-box>
            <div>
                插槽模板
            </div>
            <div>
                <button>按钮</button>
            </div>
        </alert-box>

        <p>---------具名插槽的使用一 ---------</p>

        <alert-base>
            <p slot='header'>我是头部</p>
            <span>我是中间</span> </br>
            <span>我是中间</span>
            <p slot='footer'>我是底部</p>
        </alert-base>

        <p>---------具名插槽的使用二 ---------</p>

        <alert-base>
            <template slot='header'>
                <p>我是头部1</p>
                <p>我是头部2</p>
            </template>

            <span>我是中间</span> </br>
            <span>我是中间</span>

            <template slot='footer'>
                <p>我是底部1</p>
                <p>我是底部2</p>
            </template>
        </alert-base>

        <p>-----------作用域插槽--------------------</p>

        <show-list :list='list'>
            <template slot-scope="slop_scope">
                <!-- 子组件中通过绑定属性 将组件中的对象传递到父组件中 父组件中对子组件中的数据进行处理 -->
                <strong v-if='slop_scope.info.id === 2' class='current'>{{slop_scope.info.name}}</strong>
                <span v-else>{{slop_scope.info.name}}</span>
            </template>
        </show-list>
    </div>
    <script>


        Vue.component('show-list', {
            props: ['list'],
            data: function () {
                return {}
            },
            // 使用插槽替换原来现实内容
            template: `
            <ul>
            <li :key='item.id' v-for='item in list'>
                <slot :info='item'>{{item.name}}</slot>
                </li>
            </ul>
            `
        })

        Vue.component('alert-base', {
            data: function () {
                return {}
            },
            template:
                `
            <div>
                <header>
                <slot name='header'></slot>
                </header>
                <main>
                    <slot></slot>
                </main>
                <footer>
                    <slot name='footer'></slot>
                </footer>
            </div>
         
            `
        })
        Vue.component('alert-box', {
            data: function () {
                return {}
            },
            template: `
            <div>
              <div>插槽的内容是:</div>
              <slot>默认内容</slot>
            </div>
            `
        })
        var vm = new Vue({
            el: '#app',
            data: {
                msg: '',
                list: [{
                    id: 1,
                    name: 'orange'
                }, {
                    id: 2,
                    name: 'apple'
                }, {
                    id: 3,
                    name: 'banana'
                }]
            },
            methods: {
            },
        })
    </script>
</body>

</html>

<!-- 父组件向子组件中动态的插入内容 子组件中预留插槽接收父组件中模板中的内容-->
<!-- 1.父组件中存在模板内容的情况下 模板内容会替换插槽显示 没有模板内容情况下 会显示插槽中的默认内容 -->
<!-- 2. 具名插槽的使用 ： 向对应的申明名称中 插入对应内容 -->
<!-- 3.template 标签的使用 包裹多个标签 插入到具名标签中  -->
<!-- 作用域插槽的使用：在父组件中对子组件中数据进行处理 -->